package com.byxy.common.dao;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.List;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;

public abstract class BaseDaoImpl<T> implements BaseDao<T>{
	@Autowired
	protected SessionFactory sessionFactory;

	private Class<T> classname;


	@Override
	public void add(T entity) {
		// TODO �Զ����ɵķ������

		sessionFactory.getCurrentSession().save(entity);
	}

	@Override
	public void delete(T entity) {
		// TODO �Զ����ɵķ������
		sessionFactory.getCurrentSession().delete(entity);
	}

	@Override
	public void update(T entity) {
		// TODO �Զ����ɵķ������
		sessionFactory.getCurrentSession().saveOrUpdate(entity);
	}

	@Override
	public List<T> all() {
		// TODO �Զ����ɵķ������
		return sessionFactory.getCurrentSession().createQuery("from " + classname.getSimpleName()).list();
	}

	@Override
	public int conut() {
		// TODO �Զ����ɵķ������

		Long l=(Long)sessionFactory.getCurrentSession().createQuery("select count(u) from "+classname.getSimpleName()+" u").uniqueResult();
		return l.intValue();
	}

	@Override
	public T get(Serializable id) {
		// TODO �Զ����ɵķ������

		return (T)sessionFactory.getCurrentSession().get(classname,id);

	}

	@Override
	public List<T> parts(int page, int row) {
		// TODO �Զ����ɵķ������
		List<T> list = sessionFactory.getCurrentSession().createQuery("from " + classname.getSimpleName())
				.setFirstResult((page - 1) * row).setMaxResults(row).list();
		return list;
	}

	public BaseDaoImpl() {
		ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();
		classname = (Class) type.getActualTypeArguments()[0];
	}
	

}
